# 求一个数字有多少位
# 数字 -> 字符串 -> len(字符串)

# 求一个数字所有位的和
# 数字 -> 字符串 -> 每一个数字位构成的数组
# sum(digits)

def sum_digits(num):
  digits = [int(digit) for digit in str(num)]
  return sum(digits)

print(sum_digits(12345))

# 数组的遍历
# 索引 0
# [1, 2, 3, 4, 5]
#  ^     ^     ^
array = [1, 2, 3, 4, 5]
# array[起始位置:终止位置:steps]
print(array[0::2])

# 统计元素出现的次数
# count
array = [4, 2, 3, 4, 4]
print(array.count(4)) # 3

# len(arr) // 2

# N, P, D
# 124987 => [1, 2, 4, 9, 8, 7]

# P = -3
# [1, 2, 4, 9, 8, 7]
#           ^P=-3
#              -2,-1
# P 右边一直到数组末尾：
# range(-P + 1, 0)


# 1234 => array [1, 2, 3, 4] => array[0]

def encode_num(num, P, D):
  digits = [int(digit) for digit in str(num)]

  if 0<= digits[-P] <= 4:
    digits[-P] = (digits[-P] + D) % 10

    for i in range(-P + 1, 0):
      digits[i] = 0

  elif 5 <= digits[-P] <= 9:
    val = abs(digits[-P] - D)
    # 取 val 最左边的数字
    digits[-P] = int(str(val)[0])

    for i in range(-P + 1, 0):
      digits[i] = 0

  # digits => string
  return "".join(str(digit) for digit in digits)

print(encode_num(124987, 2, 3))

# s d r
# 写一个函数，它可以把多位数字按要求，变成 1 位数字
def merge_digits(num):
  # 判断位数
  # 变成字符串求长度
  if len(str(num)) == 1:
    return num
  else:
    digits = [int(digit) for digit in str(num)]
    return merge_digits(sum(digits))

# 构建数字三角形
# 计算最后一行上所有数字的和
def next(curr, d):
  return merge_digits(curr + d)

# 第 r 行所有数字的总和
# 我们知道第 r 行一共有 r 个数字
# 如果我们知道第 r 行的第 1 个数字
# 我们就得知道第 r 行之前一共有多少数字
# 1 2 3 4 ...
# 每一行的数字个数形成的序列，叫做一个等差数列
# 求第 n 个元素的值
# An = A1 + n(n-1)/2 * 公差
# An = 1 + n(n-1)/2
# A(r-1) = 1 + (r-1)(r-2)/2

def digit_triangle(s, d, r):
  n = 1 + (r - 1) * (r - 2) // 2
  # 基于 s 生成 n 个数字三角形中的数字

  curr = s
  for i in range(1, n):
    curr = next(curr, d)
    
  sum = 0

  for i in range(0, r):
    curr = next(curr, d)
    sum += curr
  
  return sum

print(digit_triangle(2, 3, 5))